내부 표현부를 노출하지 않고, 집합 객체에 속한 원소들을 순차적으로 접근할 수 있는 방법을 제공하는 패턴

Aggregate로 집합체의 기본 기능을 구현한 후, Iterator로 순환하는 것을 구현 해보았습니다.
Java의 Collection을 생각하면서 만들었습니다.
내부에서 최대 사이즈를 저장하고, 배열을 이용해 저장하지만 ArrayList처럼 객체를 입력받아 저장하고 삭제하고 하는 동작을 합니다.
iterator() 메소드를 사용하면, 자기 객체를 넘기면서 생성한 ConcreteIterator를 반환합니다.
Iterator의 hasNext, next를 이용해 iterator에서는 내부 ConcreteAggregater에 접근하지 않고 출력 하는 등의 순차적 동작이 가능합니다.
Iterator를 통한 remove는 iterator가 현재 가리키는 index의 것을 삭제하고 다음으로 넘어갑니다.
ConcreteAggregate에서 Object 형태로 배열을 지정해서 Integer, String 등 다양한 클래스가 저장될 수 있습니다.
Integer List------------
1
2
3
String List1-------------
hi
there
bye
String List2-------------
remove
bye
단순히 구현했지만 구현하려한 부분은 잘 구현되었습니다.
연관된 자바 코드를 예시로 보겠습니다. 사실 직접 구현하기 보단 구현된 Collection을 이용할 경우가 더 많기 때문에 같이 보고 넘어가면 좋을 것 같습니다.
public interface Collection<E> extends Iterable<E> {}
위처럼 Iterable을 extends합니다.
Iterable을 따라가보면 다음처럼 Aggregate와 비슷합니다.
public interface Iterable<T> {
/**
* Returns an iterator over elements of type {@code T}.
*
* @return an Iterator.
*/
Iterator<T> iterator();
...
}
또 저기서 Iterator는 위의 예제와 같이 hasNext, next 등의 메소드를 가지고 있습니다.
유지보수가 필요한 장기간 이용되는 코드의 경우, 결합도를 낮출 수 있는 Iterator를 이용하는 것이 효율적입니다.
참조
감사합니다.
Text by Chaelin. Photographs by Chaelin, Unsplash.